{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "39e6a505",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Not running on CoLab\n"
     ]
    }
   ],
   "source": [
    "if 'google.colab' in str(get_ipython()):\n",
    "    print('Running on CoLab')\n",
    "    !pip install -U ipython\n",
    "    !pip install roboticstoolbox-python\n",
    "    !pip install machinevision-toolbox-python\n",
    "else:\n",
    "    print('Not running on CoLab')\n",
    "\n",
    "from IPython.core.interactiveshell import InteractiveShell\n",
    "InteractiveShell.ast_node_interactivity = \"last_expr_or_assign\"\n",
    "\n",
    "%matplotlib ipympl\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "# add RTB examples folder to the path\n",
    "import sys\n",
    "import os.path\n",
    "import roboticstoolbox as rtb\n",
    "sys.path.append(os.path.join(rtb.__path__[0], 'examples'))\n",
    "\n",
    "# ------ standard imports ------ #\n",
    "import numpy as np\n",
    "from scipy import linalg\n",
    "import math\n",
    "from math import pi\n",
    "np.set_printoptions(\n",
    "    linewidth=120, formatter={\n",
    "        'float': lambda x: f\"{0:8.4g}\" if abs(x) < 1e-10 else f\"{x:8.4g}\"})\n",
    "np.random.seed(0)\n",
    "from spatialmath import *\n",
    "from spatialmath.base import *\n",
    "from roboticstoolbox import *\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "78d7dc48",
   "metadata": {},
   "source": [
    "# B Linear Algebra\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b6978610",
   "metadata": {},
   "source": [
    "## B.2 Matrices\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b4723930",
   "metadata": {},
   "source": [
    "### B.2.1 Square Matrices\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "67cb4ff6",
   "metadata": {},
   "source": [
    "This demo shows a red unit vector rotating like the minute hand of a clock.  The blue vector is its linear transformation.  Twice per revolution the vectors are parallel and the red vector on those occasions are eigenvectors.  The relative scale of the blue vector is the eigenvalue.\n",
    "\n",
    "Change the four numbers to see what happens with a different transformation matrix, they are the four matrix elements given row-wise.\n",
    "\n",
    "Hit the interrupt button to stop the animation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "e36c5a96",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "matrix A =\n",
      "[[       1        2]\n",
      " [       3        4]]\n",
      "λ1 = -0.372, x1 = [ -0.8246   0.5658]\n",
      "λ2 = 5.372, x2 = [  -0.416  -0.9094]\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c2f66c6c5c4244158a0c0e0c1ad75071",
       "version_major": 2,
       "version_minor": 0
      },
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAp6UlEQVR4nO3de3DU9b3/8dcmWXY3JGBiQAgh3A8p0EqkRawIIpcjIgZO9NSKXOpULtqLijHFoMDBzjFFTmkHrKhViwULVCJTqhyVI60CVgiIDAriJYAQDVc1kF122c/vD8z+SEgAdfP9knyejxlmzO5m8/6+NzBPv5vseowxRgAAALBGgtsDAAAAwFkEIAAAgGUIQAAAAMsQgAAAAJYhAAEAACxDAAIAAFiGAAQAALAMAQgAAGAZAhAAAMAyBCAAAIBlCEAAAADLEIAAAACWIQABAAAsQwACAABYhgAEAACwDAEIAABgGQIQAADAMgQgAACAZQhAAAAAyxCAAAAAliEAAQAALEMAAgAAWIYABAAAsAwBCAAAYBkCEAAAwDIEIAAAgGUIQAAAAMsQgAAAAJYhAAEAACxDAAIAAFiGAAQAALAMAQgAAGAZAhAAAMAyBCAAAIBlCEAAAADLEIAAAACWIQABAAAsQwACTUTHjh31yCOPuD1Gk9GrVy/NnDnT7TEajZkzZ6pXr15ujwHgPBGAQCMwYcIEeTyeM/7069cvdpuNGzfqjjvucHHKhlFWViaPx6NNmza5PUqj5fF49Ne//jUu91Xf43HvvffqH//4R1y+BoCGl+T2AADOz5AhQ/Tss8/WuKxZs2ax/27VqpXTIzU64XBYXq/X7TEuSJFIRImJifJ4PN/o81NSUpSSkhLnqQA0FM4AAo2Ez+dTmzZtavxJT0+PXV/7KeD3339fAwcOlN/vV/fu3fXiiy8qJSVFzzzzTOw2+/bt080336y0tDSlpaVpxIgR2rVrV+z66qf1/vKXv6hLly5KTU3VqFGjdPDgQUnSyy+/rGbNmunQoUM1Zr3//vv1ve99L/bx+vXrNXDgQCUnJ6tdu3aaMmWKvvjii9j1xhjNnTtX3bp1k8/nU1ZWlqZNmyZJ6tSpkyTpBz/4gTwej66++mpJUjQa1ezZs9W+fXv5fD5997vf1cqVK2P3WX2m6rnnntM111yjQCCghQsX1rnbiooK5eXlKRAIqEOHDnrqqafOuM3nn3+uiRMnqnXr1kpNTdXAgQNrnAV75plnlJKSopdeekk5OTlKTk7WDTfcoM8//1x//etf1a1bN7Vs2VJjx45VVVVV7PNCoZDuuusuXXLJJfL7/erXr5/eeOON2PVr166Vx+PRmjVrdPnllys5OVnf//73tXnz5hqzjR07Vq1bt5bf71fnzp01b948Sae+LyTppptuksfjiX1c/dg+88wz6tKli3w+n44dO6bVq1frqquuUlpamtLT0/Xv//7veu+992Jfq77Ho/ZTwOf7+Dz//PMaOnSokpOT1aNHD73yyit1PkYA4osABJqgaDSq0aNHKykpSW+++aaeeeYZzZo1S6FQKHab48ePa9CgQfL7/frHP/6hDRs2qG3bthoyZIiOHz8eu11ZWZmWLl2qkpISvfzyy9qyZYuKiookSYMHD1ZGRoaWL18eu70xRkuWLNGtt94qSdq2bZuGDRumG264QVu3btWKFSv09ttv67bbbot9zv3336/Zs2dr2rRp2r59u5YvX6727dtLkt566y1J0urVq1VeXq4VK1ZIkn73u99pzpw5Ki4u1rZt2zR69Gj9x3/8h95+++0au5g2bZruuOMOvfvuuxo1alSd+5owYYI++OADvfrqq3rhhRe0aNEilZWV1TimESNGaN++fVq1apW2bNmiAQMG6JprrlF5eXnsdqFQSHPnztXixYu1Zs0abdq0Sfn5+frTn/6k559/Xi+88IJWrVqlRx99NPY59913n5YuXaqnnnpKW7Zs0Xe/+11de+21Ne63+jgefvhhbd68WRdffLHGjBkjY4wkafr06dq2bZtWrVqlnTt36qmnnlK7du0knfrRAEl64oknVF5eHvtYkj7++GMtWbJEy5cv19atW+X3+3Xs2DHdddddeuutt7R27Vq1bNlSI0eO1IkTJ876eNR2vo9PUVGRfvGLX2jr1q36wQ9+oJtvvlmVlZV13ieAODIALnjjx483iYmJpnnz5jX+3HfffbHbdOjQwcyZM8cYY8zq1atNYmKi+eSTT2LXr1u3zkgyTz/9tDHGmD/+8Y+ma9euJhqNxm4TiURMenq6Wbp0qTHGmBkzZhifz2eOHj0au81DDz1kunTpEvv47rvvNv379499/Prrr5uEhASzd+9eY4wxY8eONbfddluN49myZYuRZD777DPz5ZdfGp/PZ/7whz/Ueewff/yxkWQ2btxY4/LMzEwza9asGpcNHDjQjBkzpsbnPfLII3Xeb7WdO3caSeaNN96IXVZWVmYSEhLMjBkzjDHGrFmzxjRv3twcP368xudeeumlpri42BhjzNNPP20kmR07dsSunzp1qklISDAHDhyIXTZ+/HgzYsQIY4wxlZWVxuv1mj/96U+x6yORiOncubMpKioyxhjz2muvGUlm9erVsdu88cYbRlJsxyNHjjQ/+clP6j1GSWb58uU1LpsxY4ZJSkoyn3766Vn3U1lZaRISEszrr79ujKn/8ZgxY4bp2bNn7OPzfXwee+yx2PWffPKJkRT7WgAaDj8DCDQSAwYM0OOPP17jsosuuqjO2+7YsUOZmZmxs0DSqafsEhL+/0n/0tJSffzxx0pNTa3xucePH9eHH34Y+7hDhw5q2bJl7OPMzExVVFTEPr711ls1b9487d69Wx06dNDixYs1cOBAZWVlxb7OBx98oKVLl8Y+x3x15urDDz9UYmKiQqGQBg8efL6r0BdffKH9+/fryiuvrHF5//799eKLL9a47Pvf//5Z7+u9995TQkKC+vbtW+OYMzMzYx+Xlpbq+PHjZ/ycZTAYrLErn8+n7t27xz6+5JJL1KZNG2VkZNS47N1335V06vjD4XCN40hMTNQVV1wRu021059Sr56toqJCWVlZmjJlim688UaVlpZq6NChGjlypAYOHHjW45akrKwsXXLJJTUu+/DDD/XAAw/oX//6lw4cOKBoNKpoNKo9e/ac8/6qfZ3Hp77jAtCwCECgkUhOTlbXrl3jdn/RaFS9e/fWX/7ylzOuO/1nC2v/0oTH41E0Go19fNlllyknJ0dLlizRvffeq+XLl+s3v/lNja/z05/+VHffffcZX6ddu3batm1bPA6nxnyna968+Tf6vNNFo1Fdcsklev3118+4rkWLFrH/Tkqq+U+qx+M55/7Od57T76f6uur7GT58uHbv3q2XXnpJa9as0YgRI3TTTTfp6aefPuvXqGs3119/vbKysrRw4UK1a9dOSUlJ6tGjR+wp4G/r6xwXgIZDAAJNUE5Ojvbv36/9+/fHzqps2rTpjHB77rnnlJGRUe+ZxPN16623avHixerVq5eOHTumG2+8scbX2b59e73x+p3vfEc+n09r1qxRt27dzri++jedT548GbusRYsWyszM1Lp162qcOXzjjTfUo0ePrzV7Tk6OotGo3nrrLf3whz+UJO3Zs0f79++vcQyfffaZEhIS1Llz5691/2fTpUsXNWvWTOvWrVOXLl0knTrODRs26JZbbvla95WRkaGxY8dq7NixGj58uH784x/rsccek8/nk9frrbG/+hw6dEg7duzQo48+qkGDBkmSNm/erEgkErtNXY9HbfF8fAA0DAIQaCRCoZA+/fTTGpclJibW+fIvQ4cOVffu3TV+/Hg98sgjqqqq0j333KOkpKTYWZYxY8bokUceUV5env7rv/5L2dnZ2rt3r1auXKnJkyfXGWP1GTNmjKZPn64HHnhAI0eOrHFWrLCwUP369dPkyZM1adIkpaamaseOHfrb3/6mhQsXKjU1Vb/85S81bdo0+Xw+DRgwQIcOHVJpaammTJmi1q1bKxAI6H//93/VsWNH+f1+tWzZUgUFBXrwwQfVrVs39enTR3/+85/1+uuv1/jt2PPRvXt3XXvttZo0aZIef/xxBQIB3XPPPQoEArHbDBkyRFdeeaXy8vL0m9/8Rjk5Ofr000+1evVqDRkyRFddddXX+prVmjdvrilTpqiwsFAZGRnq1KmTfvvb3+qzzz77Wq/p+OCDD+qyyy5Tz549FYlEtGLFCnXu3Fk+n0/Sqd8EXrNmjQYOHCifz6e0tLQ67yctLU0ZGRl64okn1L59e+3bt08FBQU1zmzW93jUFq/HB0DD4LeAgUbi1VdfVdu2bWv8yc3NrfO2CQkJKikpUSgUUt++fTV+/HgVFRXJ4/HI7/dLOvWU8j//+U917txZN910k3JycjR+/HgdOXKk3kCoT4cOHdS/f39t3bo19tu/1b73ve/pn//8p8rKyjRw4EBdeumlmjZtWo2fPfvv//5vFRYWavbs2frOd76j/Px8ffLJJ5JOPa36+9//Xk8++aQyMzOVl5cnSfrFL36hgoIC3XffferVq5dKSkr0/PPP69JLL/1as0unXsKlU6dOuuaaazRy5EjdcsstsZdLkU49Nfniiy/qmmuu0e23367u3bvrP//zP7Vz584aPyv4TRQXF+tHP/qRfvKTn6h379565513tHr1arVt2/a878Pn86moqEiXXnqprrzySn355Zf629/+Frt+7ty5eu2119S+fft6v2ekU983S5cu1TvvvKNevXrpzjvv1OzZs2MhKdX/eNQWz8cH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",
      "text/html": [
       "\n",
       "            <div style=\"display: inline-block;\">\n",
       "                <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n",
       "                    Figure\n",
       "                </div>\n",
       "                <img src='' width=640.0/>\n",
       "            </div>\n",
       "        "
      ],
      "text/plain": [
       "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%run -m eigdemo 1 2 3 4"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a0f91717",
   "metadata": {},
   "source": [
    "# C Geometry\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bcacdc7c",
   "metadata": {},
   "source": [
    "## C.1 Euclidean Geometry\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf3373b1",
   "metadata": {
    "lines_to_next_cell": 2
   },
   "source": [
    "### C.1.2 Lines\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7d70bced",
   "metadata": {},
   "source": [
    "#### C.1.2.2 Lines in 3D and Plücker Coordinates\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "e1f20cae",
   "metadata": {},
   "outputs": [],
   "source": [
    "P = [2, 3, 4]; Q = [3, 5, 7];"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "e839250c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{ 1 -2 1; -1 -2 -3}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "L = Line3.Join(P, Q)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "cda46d17",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([      -1,       -2,       -3])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "L.v.T\n",
    "L.w.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "4ad38a8a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[       0,        1,        2,       -1],\n",
       "       [      -1,        0,        1,       -2],\n",
       "       [      -2,       -1,        0,       -3],\n",
       "       [       1,        2,        3,        0]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "L.skew()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "0b322af7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Axes3DSubplot(0.125,0.125;0.775x0.755)\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotvol3([-5, 5]);\n",
    "L.plot(\"b\");"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "98262495",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  0.5714,   0.3042,  0.03691],\n",
       "       [  0.1429,  -0.3917,  -0.9262],\n",
       "       [ -0.2857,   -1.087,   -1.889]])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "L.point([0, 1, 2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "ebf71c3b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6546536707079771"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[x, d] = L.closest_to_point([1, 2, 3])\n",
    "x\n",
    "d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "6429840f",
   "metadata": {
    "lines_to_next_cell": 2
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  0.6667,   0.3333,        0])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p, _ = L.intersect_plane([0, 0, 1, 0])\n",
    "p"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "12023edb",
   "metadata": {},
   "source": [
    "### C.1.4 Ellipses and Ellipsoids\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "0c2da6ab",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 1],\n",
       "       [1, 2]])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "E = np.array([[1, 1], [1, 2]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "5a9fecdf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_ellipse(E)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "efd33949",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ -0.8507,  -0.5257],\n",
       "       [  0.5257,  -0.8507]])"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e, v = np.linalg.eig(E)\n",
    "e\n",
    "v"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "bac44e03",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([   1.618,    0.618])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r = 1 / np.sqrt(e)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "d49629eb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_arrow((0, 0), v[:,0]*r[0], color=\"r\", width=0.02);\n",
    "plot_arrow((0, 0), v[:,1]*r[1], color=\"b\", width=0.02);\n",
    "plt.gca().set_aspect('equal', 'box')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "86e4588e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "148.282525588539"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.rad2deg(np.arctan2(v[1, 0], v[0, 0]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "224add22",
   "metadata": {},
   "source": [
    "### C.1.4.1 Drawing an Ellipse\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "d0ce8dc1",
   "metadata": {},
   "outputs": [],
   "source": [
    "E = np.array([[1, 1], [1, 2]]);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "920af014",
   "metadata": {},
   "outputs": [],
   "source": [
    "th = np.linspace(0, 2*pi, 50);\n",
    "y = np.vstack([np.cos(th), np.sin(th)]);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "7276c1c6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = linalg.sqrtm(np.linalg.inv(E)) @ y;\n",
    "plt.plot(x[0, :], x[1, :], '.');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "1266a045",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_ellipse(E, [0, 0])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5f0afa12",
   "metadata": {},
   "source": [
    "#### C.1.4.2 Fitting an Ellipse to Data\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "942289fc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "rng = np.random.default_rng(0);\n",
    "# create 200 random points inside the ellipse\n",
    "x = [];\n",
    "while len(x) < 200: \n",
    "  p = rng.uniform(low=-2, high=2, size=(2,1))\n",
    "  if np.linalg.norm(p.T @ E @ p) <= 1:\n",
    "    x.append(p)\n",
    "x = np.hstack(x);  # create 2 x 50 array\n",
    "plt.plot(x[0, :], x[1, :], \"k.\"); # plot them\n",
    "# compute the moments\n",
    "m00 = mpq_point(x, 0, 0);\n",
    "m10 = mpq_point(x, 1, 0);\n",
    "m01 = mpq_point(x, 0, 1);\n",
    "xc = np.c_[m10, m01] / m00;\n",
    "# compute the central second moments\n",
    "x0 = x - xc.T;\n",
    "u20 = mpq_point(x0, 2, 0);\n",
    "u02 = mpq_point(x0, 0, 2);\n",
    "u11 = mpq_point(x0, 1, 1);\n",
    "# compute inertia tensor and ellipse matrix\n",
    "J = np.array([[u20, u11], [u11, u02]]);\n",
    "E_est = m00 / 4 * np.linalg.inv(J);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "3acfc499",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "E:\n",
      " [[1 1]\n",
      " [1 2]]\n",
      "Eest:\n",
      " [[   1.053    1.038]\n",
      " [   1.038     1.98]]\n"
     ]
    }
   ],
   "source": [
    "print(f'E:\\n {E}')\n",
    "print(f'Eest:\\n {E_est}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "507120c1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x[0, :], x[1, :], \"k.\"); # plot data points\n",
    "plot_ellipse(E_est, \"r\")          # plot fitted ellipse"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e838e8af",
   "metadata": {},
   "source": [
    "## C.2 Homogeneous Coordinates\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3b3a294a",
   "metadata": {},
   "source": [
    "### C.2.1 Two Dimensions\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4457afc4",
   "metadata": {},
   "source": [
    "#### C.2.1.1 Points and lines\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "d3ec28b6",
   "metadata": {},
   "outputs": [],
   "source": [
    "l1 = [1, -1, 0];\n",
    "l2 = [1, -1, -1];"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "a1a508a4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_homline(l1, \"b\");\n",
    "plot_homline(l2, \"r\");"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "72c5edc2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 1, 0])"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.cross(l1, l2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6777a8b2",
   "metadata": {},
   "source": [
    "# E Linearizations, Jacobians and Hessians"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "96d7a10c",
   "metadata": {},
   "source": [
    "## E.4 Deriving Jacobians\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "28d6791c",
   "metadata": {},
   "outputs": [],
   "source": [
    "zrange = lambda xi, xv, w: np.array([\n",
    "           np.linalg.norm(xi - xv[:2]) + w[0],\n",
    "           np.arctan((xi[1] - xv[1]) / (xi[0] - xv[0])) -xv[2] + w[1]]);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "f39f7b5a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  -0.832,  -0.5547,        0],\n",
       "       [ 0.05129, -0.07693,       -1]])"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xv = np.r_[1, 2, pi/3]; xi = np.r_[10, 8]; w = np.r_[0, 0];\n",
    "h0 = zrange(xi, xv, w)\n",
    "d = 0.001;\n",
    "J = np.column_stack([\n",
    "       zrange(xi, xv + [d, 0, 0], w) - h0,\n",
    "       zrange(xi, xv + [0, d, 0], w) - h0,\n",
    "       zrange(xi, xv + [0, 0, d], w) - h0\n",
    "                    ]) / d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "2dc79849",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ -0.8321,  -0.5547,        0],\n",
       "       [ 0.05128, -0.07692,       -1]])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "numjac(lambda x: zrange(xi, x, w), xv)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "908ade06",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sympy import Matrix, MatrixSymbol, sqrt, atan, simplify, pycode\n",
    "xi = MatrixSymbol(\"xi\", 2, 1)\n",
    "xv = MatrixSymbol(\"xv\", 3, 1)\n",
    "w = Matrix([0, 0]);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "92e0c1d2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\sqrt{\\left(\\xi_{0, 0} - xv_{0, 0}\\right)^{2} + \\left(\\xi_{1, 0} - xv_{1, 0}\\right)^{2}}\\\\\\operatorname{atan}{\\left(\\frac{\\xi_{1, 0} - xv_{1, 0}}{\\xi_{0, 0} - xv_{0, 0}} \\right)} - xv_{2, 0}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[   sqrt((xi[0, 0] - xv[0, 0])**2 + (xi[1, 0] - xv[1, 0])**2)],\n",
       "[atan((xi[1, 0] - xv[1, 0])/(xi[0, 0] - xv[0, 0])) - xv[2, 0]]])"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "zrange = lambda xi, xv, w: Matrix([\n",
    "            sqrt((xi[0] - xv[0])**2 + (xi[1] - xv[1])**2) + w[0],\n",
    "            atan((xi[1] - xv[1]) / (xi[0] - xv[0])) -xv[2] + w[1]]);\n",
    "z = zrange(xi, xv, w)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "c72fcd78",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\frac{- \\xi_{0, 0} + xv_{0, 0}}{\\sqrt{\\left(\\xi_{0, 0} - xv_{0, 0}\\right)^{2} + \\left(\\xi_{1, 0} - xv_{1, 0}\\right)^{2}}} & \\frac{- \\xi_{1, 0} + xv_{1, 0}}{\\sqrt{\\left(\\xi_{0, 0} - xv_{0, 0}\\right)^{2} + \\left(\\xi_{1, 0} - xv_{1, 0}\\right)^{2}}} & 0\\\\\\frac{\\xi_{1, 0} - xv_{1, 0}}{\\left(1 + \\frac{\\left(\\xi_{1, 0} - xv_{1, 0}\\right)^{2}}{\\left(\\xi_{0, 0} - xv_{0, 0}\\right)^{2}}\\right) \\left(\\xi_{0, 0} - xv_{0, 0}\\right)^{2}} & - \\frac{1}{\\left(1 + \\frac{\\left(\\xi_{1, 0} - xv_{1, 0}\\right)^{2}}{\\left(\\xi_{0, 0} - xv_{0, 0}\\right)^{2}}\\right) \\left(\\xi_{0, 0} - xv_{0, 0}\\right)} & -1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[                        (-xi[0, 0] + xv[0, 0])/sqrt((xi[0, 0] - xv[0, 0])**2 + (xi[1, 0] - xv[1, 0])**2),   (-xi[1, 0] + xv[1, 0])/sqrt((xi[0, 0] - xv[0, 0])**2 + (xi[1, 0] - xv[1, 0])**2),  0],\n",
       "[(xi[1, 0] - xv[1, 0])/((1 + (xi[1, 0] - xv[1, 0])**2/(xi[0, 0] - xv[0, 0])**2)*(xi[0, 0] - xv[0, 0])**2), -1/((1 + (xi[1, 0] - xv[1, 0])**2/(xi[0, 0] - xv[0, 0])**2)*(xi[0, 0] - xv[0, 0])), -1]])"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "J = z.jacobian(xv)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "d50ee7a5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 3)"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "J.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d5226019",
   "metadata": {},
   "source": [
    "# F Solving Systems of Equations\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e261cef2",
   "metadata": {},
   "source": [
    "## F.1 Linear Problems\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5c5d3133",
   "metadata": {},
   "source": [
    "### F.1.1 Nonhomogeneous Systems\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "36a4a78e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[       6],\n",
       "       [      -1]])"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A = np.array([[1, -2], [1, 1]]);\n",
    "b = np.array([[8], [5]]);\n",
    "x = linalg.solve(A, b)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e8326d19",
   "metadata": {},
   "source": [
    "### F.1.2 Homogeneous Systems\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fa75c5b6",
   "metadata": {
    "lines_to_next_cell": 2
   },
   "source": [
    "### F.1.3 Finding a Rotation Matrix\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f2d707db",
   "metadata": {
    "lines_to_next_cell": 2
   },
   "source": [
    "flesh this out"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "06480edf",
   "metadata": {},
   "source": [
    "# G Gaussian Random Variables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "582836c6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(-6, 6, 500);\n",
    "plt.plot(x, gauss1d(0, 1, x), \"r\");\n",
    "plt.plot(x, gauss1d(0, 2**2, x), \"b--\");"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "b28748ed",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([   13.77,    7.304,    7.459,    11.94,    7.654,    13.89,    9.173,    8.505,    13.85,    12.96,    13.74,\n",
       "          11.81,    8.278,    13.82,    9.464,     11.6,    11.89,     9.69,    11.23,    11.84,    10.75,    7.801,\n",
       "           10.6,    12.65,    8.611,    9.701,     9.13,     13.7,    11.34,    10.81,     8.46,    11.08,    8.651,\n",
       "          10.06,    8.728,    11.35,    11.15,    9.583,    10.79,    7.814,    7.017,    10.88,    10.33,    11.27,\n",
       "          14.77,    11.89,    8.174,    12.23,    7.368,    9.077,    9.864,    13.43,     8.51,    8.347,    9.803,\n",
       "          8.673,    12.25,     7.84,    7.705,    9.124,    9.004,    13.86,     11.9,    10.18,    7.549,    11.69,\n",
       "              8,     6.91,    12.38,    10.63,    11.84,    10.64,    11.71,    8.698,    7.932,    11.36,    8.393,\n",
       "          8.621,    9.089,    10.03,    9.292,     7.25,    8.713,    5.553,    11.25,    6.796,    7.791,     10.1,\n",
       "          8.521,    13.09,    7.414,    10.53,    9.921,    7.664,    11.05,    9.657,    11.54,    11.65,    14.33,\n",
       "          12.67])"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mu = 10; sigma = 2;\n",
    "g = np.random.normal(loc=mu, scale=sigma, size=(100,))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "3a3c6caf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x, y = np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-5, 5, 100));\n",
    "P = np.diag([1, 2])**2;\n",
    "g = gauss2d([0, 0], P, x, y);\n",
    "ax = ax = plotvol3();\n",
    "ax.plot_surface(x, y, g);\n",
    "ax.contour(x, y, g, zdir=\"z\", offset=-0.05);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "54182d82",
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.stats.distributions import chi2\n",
    "chi2.ppf(0.5, 2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "80545342",
   "metadata": {},
   "source": [
    "# H Kalman Filter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ff272e4d",
   "metadata": {},
   "source": [
    "## H.2 Nonlinear Systems -- Extended Kalman Filter\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "cb9492d7",
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.random.normal(5, 2, size=(1_000_000,));"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "805f1d30",
   "metadata": {},
   "outputs": [],
   "source": [
    "y = (x + 2)**2 / 4;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "076914c2",
   "metadata": {
    "lines_to_next_cell": 2
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.hist(y, bins=200, density=True, histtype=\"step\");"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "000b8366",
   "metadata": {},
   "source": [
    "# I Graphs\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "b625fbe6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": []
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pgraph\n",
    "g = pgraph.UGraph()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "5a121e53",
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(0)  # ensure repeatable results\n",
    "for i in range(5):\n",
    "  g.add_vertex(np.random.rand(2));"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "5aefda27",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "UVertex[#1, coord=(0.6028, 0.5449)]"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "5009c67e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "UVertex[#1, coord=(0.6028, 0.5449)]"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g[\"#1\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "7d6b6006",
   "metadata": {},
   "outputs": [],
   "source": [
    "g.add_edge(g[0], g[1]);\n",
    "g.add_edge(g[0], g[2]);\n",
    "g.add_edge(g[0], g[3]);\n",
    "g.add_edge(g[1], g[2]);\n",
    "g.add_edge(g[1], g[3]);\n",
    "g.add_edge(g[3], g[4]);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "a7ffac93",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "UGraph: 5 vertices, 6 edges, 1 component\n"
     ]
    }
   ],
   "source": [
    "print(g)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "938b62ee",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "g.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "7bd82a36",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[UVertex[#0, coord=(0.5488, 0.7152)],\n",
       " UVertex[#2, coord=(0.4237, 0.6459)],\n",
       " UVertex[#3, coord=(0.4376, 0.8918)]]"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g[1].adjacent()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "21f7f274",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Edge{[#0] -- [#1], cost=0.1786},\n",
       " Edge{[#1] -- [#2], cost=0.2056},\n",
       " Edge{[#1] -- [#3], cost=0.3842}]"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g[1].edges()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "450fe73f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[UVertex[#0, coord=(0.5488, 0.7152)], UVertex[#1, coord=(0.6028, 0.5449)]]"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g[1].edges()[0].endpoints"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "625f510d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.1786470956951876"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g[1].edges()[0].cost"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "9e883071",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(UVertex[#1, coord=(0.6028, 0.5449)], 0.11213746732281339)"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.closest((0.5, 0.5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "8bc7fbd3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[UVertex[#2, coord=(0.4237, 0.6459)],\n",
       " UVertex[#0, coord=(0.5488, 0.7152)],\n",
       " UVertex[#3, coord=(0.4376, 0.8918)],\n",
       " UVertex[#4, coord=(0.9637, 0.3834)]]"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "path, length, _ = g.path_Astar(g[2], g[4])\n",
    "path"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "6cc48d27",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0832988437645112"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "length"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f922a853",
   "metadata": {},
   "source": [
    "# J Peak Finding\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "21f13380",
   "metadata": {},
   "source": [
    "## J.1 1D Signal\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "9d68a8e3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from machinevisiontoolbox import mvtb_load_matfile, findpeaks, findpeaks2d\n",
    "y = mvtb_load_matfile(\"data/peakfit.mat\")[\"y\"];\n",
    "plt.plot(y, \"-o\");"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "e2125e1e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "k = np.argmax(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "2d3b780a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9905149093257015"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y[k]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "e329128c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  0.9905,   0.6718,  -0.5799])"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "k, ypk = findpeaks(y)\n",
    "k\n",
    "ypk"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "b286dc1c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6782737789880113"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ypk[1] / ypk[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "87f0f8d7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([   7.439,    23.73,    15.24]), array([  0.9969,   0.7037,   -0.578]))"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "findpeaks(y, interp=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "753c37ac",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([7]), array([  0.9905]))"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "findpeaks(y, scale=5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c2a9e2bf",
   "metadata": {},
   "source": [
    "## J.2 2D Signal\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "id": "d38de617",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ -0.0696,  0.03483,   0.1394,   0.2436,    0.348],\n",
       "       [    0.08,   0.3754,   0.3202,     0.44,     0.56],\n",
       "       [ 0.04003,   0.1717,   0.3662,   0.4117,     0.52],\n",
       "       [0.0002136,   0.2062,   0.8766,   0.4462,   0.4802],\n",
       "       [-0.03997,  0.09166,   0.2862,   0.3317,     0.44],\n",
       "       [   -0.08,  0.04003,   0.1602,     0.28,      0.4]])"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "img = mvtb_load_matfile(\"data/peakfit.mat\")[\"image\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "id": "5a6212a5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "17"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "k = np.argmax(img)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "id": "3aa667ea",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8766197723675814"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "img.ravel()[k]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "id": "390033f9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3, 2)"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.unravel_index(k, img.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "id": "1f1d12ac",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[       2,        3,   0.8766],\n",
       "       [       1,        1,   0.3754]])"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xy = findpeaks2d(img)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "id": "f5a502e3",
   "metadata": {
    "lines_to_next_cell": 2
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[   2.109,    2.964,   0.8839,   0.5505],\n",
       "       [   1.343,    1.126,   0.4003,   0.1753]])"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xy = findpeaks2d(img, interp=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b335477f",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "jupytext": {
   "cell_metadata_filter": "-all",
   "main_language": "python",
   "notebook_metadata_filter": "-all"
  },
  "kernelspec": {
   "display_name": "Python 3.8.5 ('dev')",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5 (default, Sep  4 2020, 02:22:02) \n[Clang 10.0.0 ]"
  },
  "vscode": {
   "interpreter": {
    "hash": "b7d6b0d76025b9176285a6442c3dd6dd39bcfe7241029b7898b7106bd5e9b472"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
